package com.jenkins.test.proxy.scan;

import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @version V0.0.1
 * @ClassName: {@link MyDaoScan}
 * @Description: 扫描dao，并自动创建实现类: 无实现类的dao扫描 使用import的方式导入
 * @author: Lanzhou
 * @date: 2022/1/23 15:58
 * @Copyright:2019 All rights reserved.
 * 注意：本内容仅限于本人开发与维护，禁止外泄以及用于其他的商业目
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(AutoDaoScanBeanDefinitionRegistrar.class)
public @interface MyDaoScan {

    /**
     * 流程信息, 会将我们的注入类的元数据类放到 AutoDaoScanBeanDefinitionRegistrar 中, 然后会
     * 调用: registerBeanDefinitions() 将元数据信息和Bean信息的注册表传递下去
     * 调用: DaoScanClassPathBeanDefinitionScanner.scan() 会调用重写的 doScan()方法
     * -> 通过 isCandidateComponent() 判断是否是候选组件, 让加入到Bean信息定义中
     * -> 将扫描出来的符合候选组件的BeanDefinitionHolder 放到我们自己的程序处理, 将我们
     * GenericBeanDefinition 的信息设置好后, 返回, Spring统一初始化的时候会将我们的符合
     * 接口注册到Spring容器中, 这点我们通过getBean() -> doGetBean() -> getObjectFromFactoryBean()
     * -> doGetObjectFromFactoryBean() -> 最终通过 factory.getObject();获取我们BeanClass(BaseDaoProxyFactory)
     * 的getObject来获取, 从而注入
     */
    @AliasFor("value")
    String[] basePackage() default {};

    @AliasFor("basePackage")
    String[] value() default {};

}
